
//收集(getter) 的是watcher  触发(setter)的也是 watcher    watcher触发视图的更新
//watcher 在dep 里面

var uid=0
class Watcher{
    //Watcher 你监听的时候就要传 你监听的是那个对象target  exp  callback
    constructor(target,expression,callback){
        // console.log('////')
        // //console.log(target)
        // //console.log(expression)//ww
        // console.log(callback)
        // console.log('////')
        this.id=uid++
        this.target=target
        this.getter=parsePath(expression)
        this.callback=callback
        this.value=this.get()
       // console.log('我是Watcher类的构造器')

    }
    update(){
        //console.log('/////////////aaaaa') 
        this.run()
    }
    get(){
       //进入依赖的收集阶段 让全局的Dep.target 设置为Watcher本身
       //那么久进入了依赖的收集阶段
       Dep.target=this
       //console.log('////')
       //console.log(this)
      // console.log(Dep.target)
      // console.log('////')
    // return
       const obj=this.target //传进来的target
       //只要能找就一直找
       var value;

       try{
           value=this.getter(obj)
       }finally{
          Dep.target=null
          //所有的watcher 都在竞争  谁用完了  谁就让出位置来
       }
       console.log('////////搜索/aaaaa'+value) 
       return value
    }
    run(){
        this.getAndInvoke(this.callback)
    }
    getAndInvoke(cb){
         const value=this.get()
         //如果value不是自己的value 或者value是个对象
        // console.log('....'+value)
         if(value !==this.value || typeof value=='object'){
            const oldValue=this.value
            this.value=value
            cb.call(this.target,value,oldValue) //oldValue就是参数 传过去
         }
        
    }
}

function parsePath(string){
    const segment=string.split('.')
    // console.log('....wwwww'+string)
    // console.log('....wwwww'+segment)
    return (obj)=>{
        for(let aa=0;aa<segment.length;aa++){
            if(!obj){
               return
            }
            obj=obj[segment[aa]]
        }
        console.log('....'+obj)
        return obj
    }
  }